package com.w.picture.manager.websocket;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

import javax.annotation.Resource;

/**
 * WebSocket配置类。
 * 此类用于配置WebSocket连接的相关设置，包括注册处理程序、添加拦截器以及设置允许的源。
 *
 * @author wzp
 * @since 2025/2/2
 */
@Configuration
@EnableWebSocket // 启用WebSocket支持，确保Spring能够识别并处理WebSocket相关的配置
public class WebSocketConfig implements WebSocketConfigurer { // 实现WebSocketConfigurer接口以自定义WebSocket配置

    /**
     * 注入PictureEditHandler实例。
     * PictureEditHandler负责处理与图片编辑相关的WebSocket消息。
     */
    @Resource
    private PictureEditHandler pictureEditHandler;

    /**
     * 注入WsHandshakeInterceptor实例。
     * WsHandshakeInterceptor是一个握手拦截器，用于在WebSocket连接建立之前执行一些预处理逻辑（如身份验证）。
     */
    @Resource
    private WsHandshakeInterceptor wsHandshakeInterceptor;

    /**
     * 注册WebSocket处理器。
     * 在此方法中，我们指定哪个处理器将处理特定路径下的WebSocket请求，并添加必要的拦截器和跨域设置。
     *
     * @param registry 提供用于注册WebSocket处理器的方法
     */
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        // 使用/picture/edit作为WebSocket连接的端点，并指定由pictureEditHandler来处理接收到的消息
        registry.addHandler(pictureEditHandler, "/ws/picture/edit")
                // 添加wsHandshakeInterceptor拦截器，在握手阶段进行额外的处理
                .addInterceptors(wsHandshakeInterceptor)
                // 设置允许所有来源的连接（"*"表示不限制），这在开发环境中常用，但在生产环境中应谨慎使用
                .setAllowedOrigins("*");
    }
}
